package com.xf.system.common.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xf.system.common.mapper.MenuMapper;
import com.xf.system.common.model.Menu;
import com.xf.system.enums.StatusEnum;
import com.xf.system.http.req.menu.MenuListReqDTO;
import com.xf.system.http.vo.menu.MenuTreeVO;
import com.xf.system.http.vo.role.RoleMenuDetailVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

/**
 * @author xiefengf
 */
@Slf4j
@Service
public class MenuService extends ServiceImpl<MenuMapper, Menu> {

    @Resource
    private MenuMapper menuMapper;

    /**
     * 查询当前角色对应的所有菜单信息
     *
     * @param id 角色主键id
     * @return 菜单列表
     */
    public List<RoleMenuDetailVO> selectMenuByRid(Long id) {
        return menuMapper.selectMenuByRid(id);
    }

    /**
     * 条件查询所有菜单数据
     *
     * @param reqDto 菜单名称+菜单状态
     * @return 菜单列表
     */
    public List<Menu> selectMenuList(MenuListReqDTO reqDto) {
        return menuMapper.selectMenuList(reqDto);
    }

    /**
     * 通过菜单id查询菜单详情信息
     *
     * @param id 菜单id
     * @return 菜单详情信息
     */
    public MenuTreeVO selectMenuById(Long id) {
        return menuMapper.selectMenuById(id);
    }

    /**
     * 根据菜单名+父菜单id查询菜单数据
     *
     * @param menuName 菜单名称
     * @param parentId 父部门id
     * @return 菜单详细信息
     */
    public Menu selectMenuByName(String menuName, Long parentId) {
        return menuMapper.selectMenuByName(menuName, parentId);
    }

    /**
     * 根据ID查询所有子菜单（正常状态+停用状态）
     *
     * @param id 菜单主键id
     * @return 子菜单数
     */
    public List<Menu> selectChildrenMenuById(Long id) {
        LambdaQueryWrapper<Menu> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Menu::getParentId, id);
        return menuMapper.selectList(wrapper);
    }

    /**
     * 根据ID查询所有子菜单（正常状态）
     *
     * @param id 菜单主键id
     * @return 子菜单数
     */
    public List<Menu> selectNormalChildrenMenuById(Long id) {
        LambdaQueryWrapper<Menu> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Menu::getParentId, id)
                .eq(Menu::getStatus, StatusEnum.ENABLE.getValue());
        return menuMapper.selectList(wrapper);
    }

}
